package cn.design;

import cn.design.realize.KeyBoardInvoker;
import cn.design.realize.MacroCommand;
import cn.design.realize.RemoteControlCommand;
import cn.design.realize.TelevisionReceiver;
import cn.design.realize.impl.ChangeChannelCommand;
import cn.design.realize.impl.PowerOnCommand;
import cn.design.realize.impl.ShutDownCommand;

import java.util.ArrayList;

/**
 * @author dlq
 * @description Client角色----命令模式客户端
 * @date 2020/9/27 10:21
 * @since 1.0
 */
public class CommandClientDemo {

    public static void main(String[] args) {
        //故事背景
        //现在 你喜欢的 电视剧要开播了
        // 你(client) 拿起 遥控板  开始命令了
        // 首先  你 按下 开机键----遥控板 发送 遥控命令,遥控命令 是 开机命令
        // 然后  你 按下 换台键 找到你 追剧的那个台 ----  遥控板 发送 遥控命令,遥控命令 是 换台命令
        // 最后  你  看完剧了 ，按下 关机键 ---- 遥控板 发送 遥控命令,遥控命令 是 关机命令

        //1. 定义接收者，电视
        TelevisionReceiver receiver = new TelevisionReceiver();
        //2.定义 三个遥控命令
        //开机命令
        RemoteControlCommand onCommand = new PowerOnCommand(receiver);
        //换台命令
        RemoteControlCommand changCommand = new ChangeChannelCommand(receiver);
        //关机命令
        RemoteControlCommand shutCommand = new ShutDownCommand(receiver);

        //3.定义 请求者 ,遥控板
        //为什么这里是三个定义 因为 有三个命令，你要三下遥控板才能执行整个过程
        KeyBoardInvoker onInvoker = new KeyBoardInvoker(onCommand);
        KeyBoardInvoker changInvoker = new KeyBoardInvoker(changCommand);
        KeyBoardInvoker shutInvoker = new KeyBoardInvoker(shutCommand);
        //4.正在执行方法
        onInvoker.action();
        System.out.println();
        changInvoker.action();
        System.out.println();
        shutInvoker.action();

        System.out.println();
        System.out.println("==============================");
        System.out.println("==============================");
        /// 使用宏命令(组合命令)，可以批量添加进行
        //利用组合模式实现
        MacroCommand macroCommand = new MacroCommand(new ArrayList<>());
        //添加所有的命令，这里有顺序的添加----开机命令 , 换台命令 , 关机命令
        macroCommand.add(onCommand);
        macroCommand.add(changCommand);
        macroCommand.add(shutCommand);

        //打包命令一起执行
        macroCommand.execute();


    }
}
